package rhplus.persistencia;

import java.io.Serializable;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.util.List;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import javax.jdo.PersistenceManager;
import rhplus.acessoBD.PMF;
import rhplus.sistema.Seguranca;

@PersistenceCapable
public class ContaDeUtilizador implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id_pessoa;
    @Persistent
    private String username;
    @Persistent
    private String password;
    @Persistent
    private String estado;
    @Persistent
    private String perfil;

    public ContaDeUtilizador(final String username, final String password, final String estado) {

        this.username = username;
        this.password = password;
        this.estado = estado;
    }

    public void setIdPessoa(Long id) {
        this.id_pessoa = id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String pass) {
        this.password = pass;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String i) {
        this.estado = i;
    }

    public Long getIdPessoa() {
        return id_pessoa;
    }

    public String getPerfil() {
        return perfil;
    }

    public void setPerfil(String p) {
        this.perfil = p;
    }

    public void setAll(ContaDeUtilizador u) {
        this.estado = u.getEstado();
        this.password = u.getPassword();
        this.perfil = u.getPerfil();
        this.username = u.getUsername();
    }

    public static void alteraPerfil(final Long id_pessoa, final String perfil) {
        PersistenceManager pm = PMF.get().getPersistenceManager();

//        String query = "select from " + ContaDeUtilizador.class.getName()
//                + " where id_pessoa == " + id_pessoa;
//
//        ContaDeUtilizador conta = (ContaDeUtilizador) pm.newQuery(query).execute();

        try {
            pm.currentTransaction().begin();

            ContaDeUtilizador conta = pm.getObjectById(ContaDeUtilizador.class, id_pessoa);
            conta.setPerfil(perfil);

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static ContaDeUtilizador devolve(final String username) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";

        ContaDeUtilizador conta_de_utilizador = (ContaDeUtilizador) pm.newQuery(query).execute();

        return conta_de_utilizador;

    }

    public static List<ContaDeUtilizador> devolveTodas()
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        // Consulta a BD
        String query = "select from " + ContaDeUtilizador.class.getName();
        PersistenceManager pm = PMF.get().getPersistenceManager();
        List<ContaDeUtilizador> lista_de_contas_de_utilizador = (List<ContaDeUtilizador>) pm.newQuery(query).execute();

        return lista_de_contas_de_utilizador;

    }

    public static boolean existeUsername(final String username) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";
        //ContaDeUtilizador conta = (ContaDeUtilizador) pm.newQuery(query).execute();
        List<ContaDeUtilizador> conta = (List<ContaDeUtilizador>) pm.newQuery(query).execute();

        return !conta.isEmpty();
    }

    public static List<String> devolveTodosOsUsernames() {
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select username from " + ContaDeUtilizador.class.getName();

        List<String> lista_de_usernames = (List<String>) pm.newQuery(query).execute();

        return lista_de_usernames;

    }

    public static String devolvePassword(final String username) {
        // Consulta a BD
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select password from " + ContaDeUtilizador.class.getName()
                + "where username == '" + username + "'";

        String password = (String) pm.newQuery(query).execute();

        return password;

    }

    public static Long devolveIdPessoa(final String username) {
        // Consulta a BD
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select id_pessoa from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";

        Long id_pessoa = (Long) pm.newQuery(query).execute();

        return id_pessoa;

    }

    public static String devolveUsername(final Long id_pessoa) {
        // Consulta a BD
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where id_pessoa == " + id_pessoa;

        return ((List<ContaDeUtilizador>) pm.newQuery(query).execute()).get(0).getUsername();

    }

    public static String devolvePerfil(final String username) {
        // Consulta a BD
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";

        return ((List<ContaDeUtilizador>) pm.newQuery(query).execute()).get(0).getPerfil();

    }

    public static String devolvePerfil(final Long id_pessoa) {
        // Consulta a BD
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where id_pessoa == " + id_pessoa;

        return ((List<ContaDeUtilizador>) pm.newQuery(query).execute()).get(0).getPerfil();

    }

    public static void alteraPassword(final String username, final String password) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";
        ContaDeUtilizador conta = (ContaDeUtilizador) pm.newQuery(query).execute();

        try {
            pm.currentTransaction().begin();
            conta.setPassword(password);
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }

    }

    public static boolean eValida(final String username, final String password) throws NoSuchAlgorithmException {

        String password_encriptada = Seguranca.converteParaMD5(password);

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "' && password == '" + password_encriptada + "'";

        List<ContaDeUtilizador> conta = (List<ContaDeUtilizador>) pm.newQuery(query).execute();

        return !conta.isEmpty();
    }

    public static void activa(final String username)
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        // Consulta a BD
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";
        ContaDeUtilizador conta = (ContaDeUtilizador) pm.newQuery(query).execute();


        try {
            pm.currentTransaction().begin();
            conta.setEstado("1");
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }

    }

    public static void desactiva(final String username) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        // Consulta a BD
        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";
        ContaDeUtilizador conta = (ContaDeUtilizador) pm.newQuery(query).execute();

        try {
            pm.currentTransaction().begin();
            conta.setEstado("0");
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }

    }

    public static boolean estaActiva(final String username) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";
        ContaDeUtilizador conta = (ContaDeUtilizador) pm.newQuery(query).execute();

        return conta.getEstado().equals("1");

    }

    public static void insere(final ContaDeUtilizador utilizador) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(utilizador);
        } finally {
            pm.close();
        }
    }

    public static void altera(final ContaDeUtilizador utilizador) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where id_pessoa == " + utilizador.getIdPessoa();

        ContaDeUtilizador conta = (ContaDeUtilizador) pm.newQuery(query).execute();

        try {
            pm.currentTransaction().begin();
            conta.setAll(utilizador);
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static void remove(final String username) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";

        List<ContaDeUtilizador> conta = (List<ContaDeUtilizador>) pm.newQuery(query).execute();

        try {
            pm.currentTransaction().begin();

            pm.deletePersistent(conta.get(0));

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }

    }

    public static void migraUtilizador(Long id_pessoa, String username, String password) {
        // membro do agregado passa a utilizador
        //remover membro do agregado
  /*  PersistenceManager pm = PMF.get().getPersistenceManager();
        String query = "select from " + MembroDoAgregado.class.getName()
        + "where id_pessoa ==" + id_pessoa;

        MembroDoAgregado membro = (MembroDoAgregado) pm.newQuery(query).execute();

        try {
        pm.deletePersistent(membro);
        } finally {
        pm.close();
        }*/
        //criar conta de utilizador para o membro
/*        ContaDeUtilizador novo = new ContaDeUtilizador(username, password, "1", id_pessoa, "cliente_particular");
        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
        pm.makePersistent(novo);
        } finally {
        pm.close();
        }*/
    }

    @Override
    public String toString() {
        return username + ";" + password + ";" + estado + ";" + id_pessoa + ";" + perfil + ";";
    }
}
